home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / iguana / incosrc / incosrc.exe / STARF / STARF.ASM < prev    next >
Assembly Source File  |  1993-08-14  |  28KB  |  1,201 lines

  1. ; ------------------------------ STARF.ASM ---------------------
  2. ; Starfield.
  3. ; (C) 1993 bye JCAB.
  4.  
  5. TRACE  = 0
  6.  
  7.         .MODEL SMALL
  8.         .STACK 400
  9.         .386
  10.         DOSSEG
  11.         LOCALS
  12.         JUMPS
  13.  
  14.  
  15. SF01 SEGMENT PARA PUBLIC
  16.    EXTRN StarFont: BYTE
  17. ENDS
  18.  
  19. INCLUDE VGASM.INC
  20. INCLUDE VTASM.INC
  21. INCLUDE VBLIB.INC
  22.  
  23.  
  24. SCRW = 80
  25. NStars = 600
  26. ; ------------ Cosinus table, and Sin() and Cos() neat macros. ----------
  27.  
  28. ANGLEDIVISOR = 6
  29. ANGLEINC = 1 SHL (ANGLEDIVISOR - 3)
  30.  
  31.         .DATA
  32.  
  33. CosTbl LABEL WORD
  34.         INCLUDE COSTBL.INC
  35.  
  36. Cos MACRO dest
  37.         SHR     BX,ANGLEDIVISOR-1
  38.         AND     BX,7FEh
  39.         MOV     &dest,[CosTbl+BX]
  40. ENDM
  41.  
  42. Sin MACRO dest
  43.         ADD     BH,(1 SHL ANGLEDIVISOR)
  44.         Cos     &dest
  45. ENDM
  46.         
  47. ;===================================================
  48. ;===================================================
  49.  
  50.  
  51.         .CODE
  52.         .STARTUP       
  53.         CLD
  54.  
  55.         CALL    SetupStarfVideo
  56.  
  57.         CALL    SetRandomStars
  58.  
  59.         CALL    InitMusic
  60.         CALL    VTDisconnectTimer
  61.  
  62.         MOV     BX,3
  63.         MOV     AL,0
  64.         CALL    VTSetSemaphore
  65.  
  66.         MOV     BX,4
  67.         MOV     DH,15
  68.         MOV     DL,1
  69.         CALL    VTMiddleSync
  70.  
  71.         CALL    TextEffect
  72.         
  73. COMMENT  #
  74.         LES     SI,CS:[DVTRunInfo]
  75.         CMP     ES:[SI+Semaphores+4],0
  76.         JZ      @@cont
  77.  
  78.     @@wlp:
  79.         CALL    CallMusic
  80.         LES     SI,CS:[DVTRunInfo]
  81.         CMP     ES:[SI+Semaphores+5],0
  82.         JE      @@wlp
  83.         JMP     @@cont1
  84.  
  85.     @@cont:
  86.         MOV     AH,16
  87.         MOV     AL,1
  88.         CALL    VTJumpPos
  89.     @@cont1:
  90. #
  91.         MOV     CS:[VBLFullHandler],OFFSET StarsFullHandler
  92.         XOR     SI,SI
  93.         CALL    InitializeTimerVBL
  94.         CALL    VBLVSync
  95.  
  96.  
  97. MainLoop:
  98.         MOV     CX,4000
  99. ;        LOOP $
  100.         SetBorder 0, 0, 0
  101. ;        WaitForDisplay
  102.  
  103.         CALL    VBLVSync
  104.         MOV     [NFrames],AX
  105.         CALL    SetDisplayPage
  106.  
  107. ; VSync
  108.  
  109.         INC     [LoopCounter]
  110.  
  111.         INC     [FrameCounter]
  112.         CMP     [FrameCounter],3
  113.         JC      @@1
  114.          MOV    [FrameCounter],0
  115.    @@1:
  116.         MOV     CX,4000
  117. ;        LOOP $
  118.  
  119.         SetBorder 63,63,63
  120.  
  121.         MOV     [Bailed],1
  122.  
  123.         MOV     CX,[NFrames]
  124.     @@mlp:
  125.          PUSH   CX
  126.          CALL   AdvanceStars
  127.          POP    CX
  128.          LOOP   @@mlp
  129.  
  130.         CALL    CalcRotateTable
  131.  
  132.         SetBorder 0, 0, 63
  133.  
  134.         CALL    ErasePoints
  135.  
  136.         SetBorder 63,63,0
  137.  
  138.         CALL    CallMusic
  139.  
  140.         SetBorder 0, 63, 0
  141.  
  142.         MOV     CX,[NFrames]
  143.     @@mlp1:
  144.          PUSH   CX
  145.          CALL   OndullateTunnel
  146.          POP    CX
  147.          LOOP   @@mlp1
  148.  
  149.         CALL    ProjectPerspective
  150.  
  151.         SetBorder 63,63,0
  152.  
  153.         CALL    CallMusic
  154.  
  155.         SetBorder 0, 63,63
  156.  
  157.         CALL    DumpPoints
  158.  
  159.         SetBorder 63,63,0
  160.  
  161.         CALL    CallMusic
  162.  
  163.         MOV     BX,2
  164.         MOV     AL,0
  165.         CALL    VTCheckSemaphore
  166.         JZ      @@cjc1
  167.          MOV    [Bailing],1
  168.     @@cjc1:
  169.  
  170.         CMP     [Bailed],0
  171.         JNZ     ByeBye
  172.  
  173.         MOV     AH,1
  174.         INT     16h
  175.         JNZ     @@Bye
  176.         JMP     MainLoop
  177.  
  178.    @@Bye:
  179.         XOR     AX,AX
  180.         INT     16h
  181.  
  182. ByeBye:
  183.         CALL    EndTimerVBL
  184.  
  185.         CALL    VTConnectTimer
  186.  
  187.         MOV     DX,3C4h                 ; Bitmask...
  188.         MOV     AX,0F02h                ; All planes
  189.         OUT     DX,AX
  190.  
  191.         MOV     DX,3CEh                 ; Bitmask...
  192.         MOV     AX,0FF08h               ; 11111111b
  193.         OUT     DX,AX
  194.         
  195.         XOR     DI,DI                   ; Clear the screen. All planes.
  196.         MOV     AX,0A000h
  197.         MOV     ES,AX
  198.         XOR     AX,AX
  199.         MOV     CX,8000h
  200.         REP STOSW
  201.  
  202.  
  203. ;        CALL    ZeroPalette
  204. ;        MOV     AX,3
  205. ;        INT     10h
  206.  
  207.         CALL    RestoreSystemTime
  208.  
  209.         MOV     AX,4C00h
  210.         INT     21h
  211.  
  212.  
  213. ; =======================================
  214.  
  215. StarsFullHandler:
  216.         PUSH    DS
  217.         PUSH    BX
  218.  
  219.         MOV     AX,@data
  220.         MOV     DS,AX
  221.  
  222. ;        CALL    SetDisplayPage
  223.  
  224.         POP     BX
  225.         POP     DS
  226.         RET
  227.  
  228.  
  229. ; =======================================
  230.  
  231. SetupStarfVideo:
  232. COMMENT #
  233.         CALL    ZeroPalette
  234.         MOV     AX,13h
  235.         INT     10h
  236.         CALL    ZeroPalette
  237.  
  238.         VSync
  239.         MOV     DX,3C0h
  240.         MOV     AL,30h
  241.         OUT     DX,AL
  242.         MOV     AL,01100001b
  243.         OUT     DX,AL 
  244.  
  245.         MOV     DX,3c4h
  246.         MOV     AX,604h                 ; "Unchain my heart". And my VGA...
  247.         OUT     DX,AX
  248.         MOV     AX,0F02h                ; All planes
  249.         OUT     DX,AX
  250.         
  251.         ; Comienzo del modo de Hz reducidos.
  252.  
  253.         MOV     DX,3D4h
  254.         MOV     CX,18h
  255.         MOV     SI,OFFSET CRTCregs
  256.      @@cl1:
  257.          LODSW
  258. ;         OUT    DX,AX
  259.          LOOP   @@cl1
  260.  
  261.         ; Final del modo de Hz reducidos.
  262.  
  263.         MOV     AX,14h                  ; Disable dword mode
  264.         OUT     DX,AX
  265.         MOV     AX,0E317h               ; Enable byte mode.
  266.         OUT     DX,AX
  267. #
  268.         MOV     DX,3C4h                 ; Bitmask...
  269.         MOV     AX,0F02h                ; All planes
  270.         OUT     DX,AX
  271.  
  272.         MOV     DX,3CEh                 ; Bitmask...
  273.         MOV     AX,0FF08h               ; 11111111b
  274.         OUT     DX,AX
  275.         
  276.         XOR     DI,DI                   ; Clear the screen. All planes.
  277.         MOV     AX,0A000h
  278.         MOV     ES,AX
  279.         XOR     AX,AX
  280.         MOV     CX,8000h
  281.         REP STOSW
  282.  
  283.         MOV     SI,OFFSET NormalPalette
  284.         MOV     CX,256
  285.         XOR     AL,AL
  286.         CALL    DumpPalette
  287.  
  288.         PUSH    DS
  289.         MOV     AX,SF01
  290.         MOV     DS,AX
  291.         MOV     AX,0A000h
  292.         MOV     ES,AX
  293.         MOV     SI,OFFSET StarFont
  294.         MOV     BX,104h
  295.     @@lp0:
  296.          MOV    DX,3C4h
  297.          MOV    AL,02h                ; One plane at a time.
  298.          MOV    AH,BH
  299.          OUT    DX,AX
  300.  
  301.          MOV    DI,3*SCRW*200
  302.          PUSH   SI
  303.  
  304. DumpPartialText MACRO b
  305.         LOCAL @@lp1
  306.          MOV    CX,64000/4/SCRW/4
  307.     @@lp1:
  308.           REPT SCRW
  309.               LODSB
  310.               OR    AL,b
  311.               STOSB
  312.               ADD   SI,3
  313.           ENDM
  314.           LOOP  @@lp1
  315. ENDM
  316.          DumpPartialText 11100000b
  317.          DumpPartialText 11101000b
  318.          DumpPartialText 11110000b
  319.          DumpPartialText 11111000b
  320.  
  321.          POP    SI
  322.          INC    SI
  323.          SHL    BH,1
  324.          DEC    BL
  325.          JNZ    @@lp0
  326.         POP     DS
  327.  
  328.         MOV     BX,3*200*SCRW
  329.         MOV     DX,3D4h
  330.         MOV     AL,0Ch
  331.         MOV     AH,BH
  332.         OUT     DX,AX
  333.         INC     AL
  334.         MOV     AH,BL
  335.         OUT     DX,AX
  336.  
  337.         RET
  338.  
  339. ; =======================================
  340.  
  341. SetDisplayPage:
  342.         MOV     DX,3D4h
  343.         MOV     BX,SCRW*200*2
  344.         TEST    [FrameCounter],2
  345.         JNZ     SHORT @@scrst
  346.          MOV    BX,SCRW*200*1
  347.          TEST   [FrameCounter],1
  348.          JNZ    SHORT @@scrst
  349.           MOV   BX,SCRW*200*0
  350.     @@scrst:
  351.         MOV     AL,0Ch
  352.         MOV     AH,BH
  353.         OUT     DX,AX
  354.         INC     AL
  355.         MOV     AH,BL
  356.         OUT     DX,AX
  357.         RET
  358.  
  359.  
  360. ; =======================================
  361.  
  362. GetRandomNumber:
  363.         MOV     AX,[RandSeed]
  364.         MOV     BX,[RandSeed2]
  365.         MOV     BP,[RandSeed3]
  366.         ADD     AX,0a137h
  367.         ADD     BX,63f7h
  368.         ADD     BP,784Ah
  369.         ROL     AX,2
  370.         MOV     [RandSeed],AX
  371.         ADD     BX,AX
  372.         ROR     BX,1
  373.         MOV     [RandSeed2],BX
  374.         SUB     BP,BX
  375.         XOR     AX,BP
  376.         MOV     [RandSeed3],BP
  377.         ADD     AX,BX
  378.         RET
  379.  
  380.  
  381. ; =======================================
  382.  
  383. SetRandomStars:
  384.         PUSH    DS
  385.         POP     ES
  386.         MOV     DI,OFFSET StarsPos
  387.         MOV     CX,NStars
  388.     @@lp:
  389. COMMENT #
  390.          CALL   GetRandomNumber
  391.          PUSH   AX
  392.          MOV    BX,AX
  393.          Cos    AX
  394.          SAR    AX,2
  395.          STOSW
  396.          POP    BX
  397.          Sin    AX
  398.          SAR    AX,2
  399.          STOSW
  400. #
  401.          CALL   GetRandomNumber
  402.          STOSW
  403.          CALL   GetRandomNumber
  404.          STOSW
  405.  
  406.          CALL   GetRandomNumber
  407.          AND    AX,7FFFh
  408.          STOSW
  409.          LOOP   @@lp
  410.  
  411.         MOV     [StarsScr10],0FFFFh
  412.         MOV     [StarsScr11],0FFFFh
  413.         MOV     [StarsScr12],0FFFFh
  414.         MOV     [StarsScr13],0FFFFh
  415.         MOV     [StarsScr20],0FFFFh
  416.         MOV     [StarsScr21],0FFFFh
  417.         MOV     [StarsScr22],0FFFFh
  418.         MOV     [StarsScr23],0FFFFh
  419.         MOV     [StarsScr30],0FFFFh
  420.         MOV     [StarsScr31],0FFFFh
  421.         MOV     [StarsScr32],0FFFFh
  422.         MOV     [StarsScr33],0FFFFh
  423.  
  424.         RET
  425.  
  426.  
  427. ; =======================================
  428.  
  429. ProjectPerspective:
  430.         PUSH    DS
  431.         POP     ES
  432.  
  433.         TEST    [FrameCounter],2
  434.         JZ      @@frame2
  435.          MOV    [DumpSize0],OFFSET StarsScr10
  436.          MOV    [DumpSize1],OFFSET StarsScr11
  437.          MOV    [DumpSize2],OFFSET StarsScr12
  438.          MOV    [DumpSize3],OFFSET StarsScr13
  439.          MOV    BP,SCRW*200*2
  440.         JMP     SHORT @@endframe
  441.     @@frame2:
  442.         TEST    [FrameCounter],1
  443.         JZ      @@frame3
  444.          MOV    [DumpSize0],OFFSET StarsScr20
  445.          MOV    [DumpSize1],OFFSET StarsScr21
  446.          MOV    [DumpSize2],OFFSET StarsScr22
  447.          MOV    [DumpSize3],OFFSET StarsScr23
  448.          MOV    BP,SCRW*200*1
  449.         JMP     SHORT @@endframe
  450.     @@frame3:
  451.          MOV    [DumpSize0],OFFSET StarsScr30
  452.          MOV    [DumpSize1],OFFSET StarsScr31
  453.          MOV    [DumpSize2],OFFSET StarsScr32
  454.          MOV    [DumpSize3],OFFSET StarsScr33
  455.          MOV    BP,SCRW*200*0
  456.     @@endframe:
  457.  
  458.         MOV     CX,NStars
  459.         MOV     SI,OFFSET StarsPos
  460.     @@lp:
  461.          MOV    AX,[SI+4]
  462.          CMP    AX,100
  463.          JL     @@notinscr
  464.  
  465.          MOV    BX,96
  466.  
  467.          MOV    AX,[SI+2]
  468.          SUB    AX,[CurrentDisplacementY]
  469.  
  470.          IMUL   BX
  471.          IDIV   WORD PTR [SI+4]
  472.          ADD    AX,189
  473.          CMP    AX,189*2
  474.          JNC    @@notinscr
  475.          MOV    DI,AX
  476.  
  477.          MOV    AX,[SI]
  478.          SUB    AX,[CurrentDisplacementX]
  479.  
  480.          IMUL   BX
  481.          IDIV   WORD PTR [SI+4]
  482.          ADD    AX,189
  483.          CMP    AX,189*2
  484.          JNC    @@notinscr
  485.  
  486. ;COMMENT #
  487.          ADD    AX,AX
  488.          ADD    DI,DI
  489.          PUSH   DI
  490.          PUSH   AX
  491.          MOV    DX,RotAngleTableCos[DI]
  492.          MOV    DI,AX
  493.          ADD    DX,RotAngleTableSin[DI]
  494.  
  495.          POP    DI
  496.          POP    AX
  497. ;#
  498. ;SUB     DI,189
  499. ;SUB     AX,189
  500. ;MOV DX,DI
  501.  
  502.          ADD    DX,100
  503.          CMP    DX,200
  504.          JNC    @@notinscr
  505.  
  506. ;COMMENT #
  507.          PUSH   DX
  508.          MOV    DX,RotAngleTableCos[DI]
  509.          MOV    DI,AX
  510.          SUB    DX,RotAngleTableSin[DI]
  511.  
  512.          POP    DI
  513. ;#
  514. ;MOV DI,DX
  515. ;MOV DX,AX
  516.  
  517.          ADD    DX,160
  518.          CMP    DX,320
  519.          JNC    @@notinscr
  520.  
  521.          ADD    DI,DI
  522.          MOV    AX,ScrOffsets[DI]
  523.          MOV    BL,DL
  524.          SHR    DX,2
  525.          ADD    AX,DX
  526.          ADD    AX,BP
  527.          XOR    BH,BH
  528.          AND    BL,3
  529.          ADD    BX,BX
  530.          MOV    DI,DumpSize0[BX]
  531.          STOSW
  532.          MOV    AL,[SI+5]
  533.          SHR    AL,1
  534.          SUB    AL,63
  535.          NEG    AL
  536.          STOSB
  537.          MOV    DumpSize0[BX],DI
  538.          MOV    [Bailed],0
  539.  
  540.     @@next:
  541.          ADD    SI,6
  542.          LOOP   @@lp
  543.  
  544.         MOV     AX,0FFFFh
  545.         MOV     DI,[DumpSize0]
  546.         STOSW
  547.         MOV     DI,[DumpSize1]
  548.         STOSW
  549.         MOV     DI,[DumpSize2]
  550.         STOSW
  551.         MOV     DI,[DumpSize3]
  552.         STOSW
  553.  
  554.         RET
  555.  
  556.     @@notinscr:
  557.         CMP     [Bailing],0
  558.         JZ      @@generate
  559.          MOV    BX,0
  560.          MOV    AX,0
  561.          MOV    WORD PTR [SI],800h
  562.          MOV    WORD PTR [SI+2],800h
  563.          MOV    WORD PTR [SI+4],1
  564.          JMP    @@next
  565.     @@generate:
  566.         PUSH    BP
  567.         CALL    WORD PTR [ModeGenerator]
  568.         POP     BP
  569.         MOV     [SI],BX
  570.         MOV     [SI+2],AX
  571.  
  572.         MOV     AX,[ZSpeed]
  573.         OR      WORD PTR [SI+4],7E00h
  574.         JMP     SHORT @@next
  575.  
  576. ; =======================================
  577.  
  578. DumpPlane MACRO p
  579. LOCAL @@f2, @@f3, @@ef, @@lp, @@end
  580.  
  581.         MOV     AX,(1 SHL p)*256+2
  582.         OUT     DX,AX
  583.         TEST    [FrameCounter],2
  584.         JZ      @@f2
  585.          MOV    SI,OFFSET StarsScr1&p
  586.         JMP     @@ef
  587.     @@f2:
  588.         TEST    [FrameCounter],1
  589.         JZ      @@f3
  590.          MOV    SI,OFFSET StarsScr2&p
  591.         JMP     @@ef
  592.     @@f3:
  593.          MOV    SI,OFFSET StarsScr3&p
  594.     @@ef:
  595.     @@lp:
  596.         LODSW
  597.         MOV     BX,AX
  598.         INC     AX
  599.         JZ      @@end
  600.         LODSB
  601.         MOV     BYTE PTR ES:[BX],AL
  602.         JMP     SHORT @@lp
  603.     @@end:
  604.  
  605. ENDM
  606.  
  607.  
  608. DumpPoints:          
  609.         MOV     AX,0A000h
  610.         MOV     ES,AX
  611.         MOV     DX,3C4h
  612.  
  613.         DumpPlane %0
  614.         DumpPlane %1
  615.         DumpPlane %2
  616.         DumpPlane %3
  617.  
  618.         RET
  619.  
  620.  
  621. ; =======================================
  622.  
  623. ErasePlane MACRO p
  624. LOCAL @@f2, @@f3, @@ef, @@lp, @@end
  625.  
  626.         TEST    [FrameCounter],2
  627.         JZ      @@f2
  628.          MOV    SI,OFFSET StarsScr1&p
  629.         JMP     @@ef
  630.     @@f2:
  631.         TEST    [FrameCounter],1
  632.         JZ      @@f3
  633.          MOV    SI,OFFSET StarsScr2&p
  634.         JMP     @@ef
  635.     @@f3:
  636.          MOV    SI,OFFSET StarsScr3&p
  637.     @@ef:
  638.         XOR     DL,DL
  639.     @@lp:
  640.         LODSW
  641.         MOV     BX,AX
  642.         INC     AX
  643.         JZ      @@end
  644.         INC     SI
  645.         MOV     BYTE PTR ES:[BX],DL
  646.         JMP     SHORT @@lp
  647.     @@end:
  648.  
  649. ENDM
  650.  
  651.  
  652. ErasePoints:
  653.         MOV     AX,0A000h
  654.         MOV     ES,AX
  655.         MOV     DX,3C4h
  656.         MOV     AX,0F02h
  657.         OUT     DX,AX
  658.  
  659.         ErasePlane %0
  660.         ErasePlane %1
  661.         ErasePlane %2
  662.         ErasePlane %3
  663.  
  664.         RET
  665.  
  666.  
  667. ; =======================================
  668.  
  669. AdvanceStars:
  670.         MOV     AX,[ZSpeed]
  671.         ADD     AX,[ZIncrement]
  672.         CMP     AX,512
  673.         JNC     @@0
  674.          MOV    [ZSpeed],AX
  675.     @@0:
  676.  
  677.         MOV     SI,OFFSET StarsPos+4
  678.         MOV     CX,NStars/10
  679.         MOV     AX,[ZSpeed]
  680.         MOV     BX,6
  681.       @@lp:
  682.          REPT 10
  683.           SUB   WORD PTR [SI],AX
  684.           ADD   SI,BX
  685.          ENDM
  686.          LOOP   @@lp
  687.  
  688.    ; Now, for some scripting & sequencing...
  689.  
  690.         CALL    DoModeScripting
  691.         CALL    PerformSpin
  692.  
  693.         RET
  694.  
  695.  
  696. ; =======================================
  697.  
  698. DoModeScripting:
  699.         DEC     [ModeCounter]
  700.         JNZ     @@ret
  701.          CMP    [ModeGenerator],OFFSET GeneratorHyper
  702.          JZ     @@chghyper
  703.          CMP    [ModeGenerator],OFFSET GeneratorCircular
  704.          JZ     @@chgcirc
  705.          CMP    [ModeGenerator],OFFSET GeneratorTwin
  706.          JZ     @@chgtwin
  707.          CMP    [ModeGenerator],OFFSET GeneratorPlane
  708.          JZ     @@chgplane
  709.          CMP    [ModeGenerator],OFFSET GeneratorFloor
  710.          JZ     @@chgfloor
  711.     @@chgrandom:
  712.           CMP    [ZIncrement],-1
  713.           JNZ    @@enterc
  714.            MOV   [ZIncrement],1
  715.            MOV   [ModeCounter],700
  716.            JMP   SHORT @@ret
  717.      @@enterc:
  718.           MOV    [ModeCounter],256
  719.           MOV    [ModeGenerator],OFFSET GeneratorHyper
  720.           JMP    SHORT @@ret
  721.      @@chgplane:
  722.           MOV    [ModeCounter],25600
  723.           MOV    [ModeGenerator],OFFSET GeneratorRandom
  724.           JMP    SHORT @@ret
  725.      @@chghyper:
  726.           MOV    [ModeCounter],2048
  727.           MOV    [ModeGenerator],OFFSET GeneratorCircular
  728.           MOV    [HorizontalCenterX],0
  729.           MOV    [DisplacementPosX],0
  730.           JMP    SHORT @@ret
  731.      @@chgfloor:
  732.           MOV    [ModeCounter],700
  733.           MOV    [ModeGenerator],OFFSET GeneratorPlane
  734. ;          MOV    [ZIncrement],-1
  735.           JMP    SHORT @@ret
  736.      @@chgtwin:
  737.           MOV    [ModeCounter],2048
  738.           MOV    [ModeGenerator],OFFSET GeneratorFloor
  739.           MOV    [HorizontalCenterX],0
  740.           MOV    [DisplacementPosX],0
  741.           JMP    SHORT @@ret
  742.      @@chgcirc:
  743.          MOV    [ModeCounter],1024
  744.          MOV    [ModeGenerator],OFFSET GeneratorTwin
  745.     @@ret:
  746.          RET
  747.  
  748. ; =======================================
  749. ; Star generators, control the whole motion of
  750. ; the spaceflight. Return new X in BX, new Y in AX.
  751. ; They will probably modify those vars at the end.
  752.  
  753. GeneratorRandom:
  754.         CALL    GetRandomNumber
  755.         PUSH    AX
  756.         CALL    GetRandomNumber
  757.         POP     BX
  758.         RET
  759.  
  760. ; =======================================
  761.  
  762. GeneratorPlane:
  763.         CALL    GetRandomNumber
  764.         PUSH    AX
  765.         CALL    GetRandomNumber
  766.         AND     AX,3FFh
  767.         ADD     AX,1000h
  768.         POP     BX
  769.         RET
  770.  
  771. ; =======================================
  772.  
  773. GeneratorTwin:
  774.         PUSH    DX
  775.         PUSH    CX
  776.  
  777.     @@otraX:
  778.         CALL    GetRandomNumber
  779.         ADD     AX,32600
  780.         CMP     AX,65200
  781.         JNC     @@otraX
  782.         SUB     AX,32600
  783.         PUSH    AX
  784.         CALL    GetRandomNumber
  785.         POP     CX
  786.         PUSH    AX
  787.  
  788.         ; X' = X*Cos(a) - Y*Sin(a)
  789.         ; Y' = X*Sin(a) + Y*Cos(a)
  790.  
  791.         MOV     BX,[TwinAngle]
  792.         Cos     AX
  793.         IMUL    CX
  794.         ADD     DX,DX
  795.         PUSH    DX
  796.         
  797.         MOV     BX,[TwinAngle]
  798.         Sin     AX
  799.         IMUL    CX
  800.         ADD     DX,DX
  801.  
  802.         POP     AX      ; DX = Y', AX = X'
  803.         POP     CX
  804.  
  805. ;COMMENT #
  806.         AND     CX,1
  807.         JZ      @@up
  808.          ADD    DX,[YCosA]
  809.          SUB    AX,[YSinA]
  810.         JMP     @@nx
  811.     @@up:
  812.          SUB    DX,[YCosA]
  813.          ADD    AX,[YSinA]
  814.     @@nx:
  815. ;#
  816.  
  817.         MOV     BX,AX
  818.         MOV     AX,DX
  819.         POP     CX
  820.         POP     DX
  821.         RET
  822.  
  823. ; =======================================
  824.  
  825. GeneratorFloor:
  826.         PUSH    DX
  827.         CALL    GetRandomNumber
  828.         PUSH    AX
  829.         MOV     BX,AX
  830.         SAL     BX,1
  831.         Cos     BP
  832.         MOV     BX,[ModeCounter]
  833.         SHL     BX,10
  834.         Sin     AX
  835.         IMUL    BP
  836.         MOV     AX,DX
  837.         SAR     AX,2
  838.         ADD     AX,1800h
  839.  
  840. COMMENT #
  841.         CALL    GetRandomNumber
  842.         AND     AX,3FFh
  843.         SUB     AX,1000h
  844.         NEG     AX
  845. #
  846.         ADD     AX,[HorizontalCenterY]
  847.         POP     BX
  848.         POP     DX
  849.         RET
  850.  
  851. ; =======================================
  852.  
  853. GeneratorCircular:
  854.         CALL    GetRandomNumber
  855.         PUSH    AX
  856.         MOV     BX,AX
  857.         Cos     AX
  858.         SAR     AX,3
  859.         ADD     AX,[HorizontalCenterX]
  860.         POP     BX
  861.         PUSH    AX
  862.         Sin     AX
  863.         SAR     AX,3
  864.         ADD     AX,[HorizontalCenterY]
  865.         POP     BX
  866.         RET
  867.  
  868. ; =======================================
  869.  
  870. GeneratorHyper:
  871.         INC     [HyperCounter]
  872.         TEST    [HyperCounter],31
  873.         JNZ     @@getst
  874.         CALL    GetRandomNumber
  875.         SAR     AX,2
  876.         MOV     BX,AX
  877.         AND     BX,3
  878.         ADD     BX,BX
  879.         MOV     [HyperPosX+BX],AX
  880.         PUSH    BX
  881.         CALL    GetRandomNumber
  882.         SAR     AX,2
  883.         POP     BX
  884.         MOV     [HyperPosY+BX],AX
  885.     @@getst:
  886.         MOV     BX,[HyperCounter]
  887.         AND     BX,3
  888.         ADD     BX,BX
  889.         MOV     AX,[HyperPosY+BX]
  890.         MOV     BX,[HyperPosX+BX]
  891.         RET
  892.  
  893. ; =======================================
  894.  
  895. OndullateTunnel:
  896.         CMP     [ModeGenerator],OFFSET GeneratorCircular
  897.         JZ      @@doitspinn
  898.         CMP     [ModeGenerator],OFFSET GeneratorFloor
  899.         JZ      @@doit
  900.          RET
  901.      @@doitspinn:
  902.         CMP     [ModeCounter],512+128
  903.         JC      @@doit
  904.         CMP     [ModeCounter],2048-512-128
  905.         JNC     @@doit
  906.         SUB     [RotXYAngle],128
  907.      @@doit:
  908.         MOV     BX,[ModeCounter]
  909.         SHL     BX,2
  910.         ADD     BX,OFFSET TunnelTable-4
  911.         MOV     AX,[BX]
  912.         MOV     [HorizontalCenterX],AX
  913.         MOV     AX,[BX+2]
  914.         MOV     [HorizontalCenterY],AX
  915.         ADD     BX,64*4
  916.         MOV     AX,[BX]
  917.         MOV     [CurrentDisplacementX],AX
  918.         MOV     AX,[BX+2]
  919.         MOV     [CurrentDisplacementY],AX
  920.  
  921.         RET
  922.  
  923. ; =======================================
  924.  
  925. PerformSpin:
  926.         CMP     [ModeGenerator],OFFSET GeneratorTwin
  927.         JZ      @@doit
  928.          RET
  929.      @@doit:
  930.         CMP     [ModeCounter],768
  931.         JC      @@goon
  932.          SUB    [RotXYAngle],128
  933.      @@goon:
  934.         ADD     [TwinAngle],128
  935.         MOV     BX,[TwinAngle]
  936.         Cos     AX
  937.         MOV     BX,1000h
  938.         IMUL    BX
  939.         ADD     DX,DX
  940.         MOV     [YCosA],DX
  941.  
  942.         MOV     BX,[TwinAngle]
  943.         Sin     AX
  944.         MOV     BX,1000h
  945.         IMUL    BX
  946.         ADD     DX,DX
  947.         MOV     [YSinA],DX
  948.         RET
  949.            
  950.  
  951. ; =======================================
  952.  
  953. CalcRotateTable:
  954.         MOV     SI,[RotXYAngle]
  955.  
  956.         MOV     CX,189
  957.         MOV     DI,OFFSET RotAngleTableSin
  958.     @@lp:
  959.          PUSH   CX
  960.          ADD    CX,CX
  961.          ADD    CX,1
  962.  
  963.          MOV    BX,SI
  964.          Sin    AX
  965.          IMUL   CX
  966.          MOV    BP,DX
  967.  
  968.          MOV    BX,SI
  969.          Cos    AX
  970.          IMUL   CX
  971.  
  972.          MOV    [DI],BP
  973.          MOV    [DI+379*2],DX
  974.          MOV    BX,OFFSET RotAngleTableSin + 378*2
  975.          SUB    BX,DI
  976.          ADD    BX,OFFSET RotAngleTableSin
  977.          NEG    DX
  978.          NEG    BP
  979.          MOV    [BX],BP
  980.          MOV    [BX+379*2],DX
  981.  
  982.          ADD    DI,2
  983.  
  984.          POP    CX
  985.          LOOP   @@lp
  986.  
  987.         MOV     [RotAngleTableSin+189*2],0
  988.         MOV     [RotAngleTableCos+189*2],0
  989.  
  990.         RET
  991.  
  992.  
  993. ; =======================================
  994.  
  995. TextEffect:
  996.         MOV     SI,OFFSET FontPalette
  997.         MOV     AL,11100001b
  998.         MOV     CX,5
  999.         CALL    DumpPalette
  1000.      @@l1:
  1001.         CALL    CallMusic
  1002.         MOV     BX,43h
  1003.         MOV     AL,0
  1004.         CALL    VTCheckSemaphore
  1005.         JZ      @@l1
  1006.         MOV     SI,OFFSET FontPalette
  1007.         MOV     AL,11101001b
  1008.         MOV     CX,5
  1009.         CALL    DumpPalette
  1010.      @@l2:
  1011.         CALL    CallMusic
  1012.         MOV     BX,44h
  1013.         MOV     AL,0
  1014.         CALL    VTCheckSemaphore
  1015.         JZ      @@l2
  1016.         MOV     SI,OFFSET FontPalette
  1017.         MOV     AL,11110001b
  1018.         MOV     CX,5
  1019.         CALL    DumpPalette
  1020.      @@l3:
  1021.         CALL    CallMusic
  1022.         MOV     BX,45h
  1023.         MOV     AL,0
  1024.         CALL    VTCheckSemaphore
  1025.         JZ      @@l3
  1026.         MOV     SI,OFFSET FontPalette
  1027.         MOV     AL,11111001b
  1028.         MOV     CX,5
  1029.         CALL    DumpPalette
  1030.      @@l4:
  1031.         CALL    CallMusic
  1032.         MOV     BX,46h
  1033.         MOV     AL,0
  1034.         CALL    VTCheckSemaphore
  1035.         JZ      @@l4
  1036.         RET
  1037.  
  1038.  
  1039. ; =======================================
  1040. ; =======================================
  1041. ; =======================================
  1042. ; =======================================
  1043. ; =======================================
  1044. ; =======================================
  1045. ; =======================================
  1046. ; =======================================
  1047. ; =======================================
  1048. ; =======================================
  1049.  
  1050.  
  1051.         .DATA
  1052.  
  1053. CRTCregs LABEL BYTE                                               ; Modo 13h
  1054.   DB 11h, 04h       ; End   vertical retrace. (0-0Fh)             ; DB 11h, 8Eh
  1055.   DB 00h, 64h       ; Horizontal total.                           ; DB 00h, 5Fh
  1056.   DB 01h, 4Fh       ; Horizontal display enable end.              ; DB 01h, 4Fh
  1057.   DB 02h, 50h       ; Start horizontal blanking.                  ; DB 02h, 50h
  1058.   DB 03h, 80h+07h   ; End   horizontal blanking. (0-1Fh)          ; DB 03h, 82h
  1059.   DB 04h, 5Bh       ; Start horizontal retrace.                   ; DB 04h, 54h
  1060.   DB 05h, 80h+05h   ; End   horizontal retrace. (0-1Fh)           ; DB 05h, 80h
  1061.   DB 06h,0FFh       ; Vertical total. (+7.0 +7.5)                 ; DB 06h, BFh
  1062.   DB 07h, 00011111b ; Overflow (high bits of vertical registers). ; DB 07h, 1Fh
  1063.   DB 08h, 00h                                                     ; DB 08h, 00h
  1064.   DB 09h, 41h                                                     ; DB 09h, 41h
  1065.   DB 0Ah, 00h                                                     ; DB 0Ah, 00h
  1066.   DB 0Bh, 00h                                                     ; DB 0Bh, 00h
  1067.   DB 0Ch, 00h                                                     ; DB 0Ch, 00h
  1068.   DB 0Dh, 00h                                                     ; DB 0Dh, 00h
  1069.   DB 0Eh, 00h                                                     ; DB 0Eh, 00h
  1070.   DB 0Fh, 00h                                                     ; DB 0Fh, 00h
  1071.   DB 10h,0C0h       ; Start vertical retrace. (+7.2 +7.7)         ; DB 10h, 9Ch
  1072. ;                 
  1073. ;    11h      ────┘ ; End   vertical retrace. (0-0Fh)
  1074.   DB 12h, 8Fh       ; Vertical display enable end. (+7.1 +7.6)    ; DB 12h, 8Fh
  1075.   DB 13h, 28h                                                     ; DB 13h, 28h
  1076.   DB 14h, 40h                                                     ; DB 14h, 40h
  1077.   DB 15h,097h       ; Start vertical blanking. (+7.3 +9.5)        ; DB 15h, 96h
  1078.   DB 16h,0F8h       ; End   vertical blanking.                    ; DB 16h, B9h
  1079.   DB 17h,0A3h                                                     ; DB 17h, A3h
  1080.   DB 18h,0FFh                                                     ; DB 18h, FFh
  1081.  
  1082. FrameCounter DW 0
  1083. RandSeed     DW 348Bh
  1084. RandSeed2    DW 7F34h
  1085. RandSeed3    DW 32bfh
  1086.  
  1087. NormalPalette LABEL BYTE
  1088.  
  1089.         DB 0,0,0
  1090.  
  1091.         REPT 12
  1092.          DB 12,12,12
  1093.         ENDM
  1094.  
  1095.  
  1096.         i = 13
  1097.         REPT 63-12
  1098.           DB i, i, i
  1099.           i = i + 1
  1100.         ENDM
  1101.  
  1102.         DB 63, 0, 0
  1103.  
  1104.         DB 768-($-NormalPalette) DUP(0)
  1105.  
  1106. FontPalette LABEL BYTE
  1107.         DB 10, 20, 7
  1108.         DB 17, 26, 18
  1109.         DB 24, 32, 29
  1110.         DB 31, 38, 41
  1111.         DB 38, 44, 52
  1112.  
  1113. ScrOffsets LABEL WORD
  1114.  
  1115.         i = 0
  1116.  
  1117.         REPT 200
  1118.           DW i
  1119.           i = i + SCRW
  1120.         ENDM
  1121.  
  1122.  
  1123.  
  1124. ZSpeed      DW 0
  1125. ZIncrement  DW 1
  1126.  
  1127. ModeCounter DW 700
  1128. LoopCounter DW 0
  1129. NFrames     DW 0
  1130. Bailing     DB 0
  1131. Bailed      DB 0
  1132.  
  1133. ModeGenerator DW OFFSET GeneratorRandom
  1134.  
  1135. HorizontalCenterX    DW 0
  1136. HorizontalCenterY    DW 0
  1137.  
  1138. CurrentDisplacementX DW 0
  1139. CurrentDisplacementY DW 0
  1140.  
  1141. DisplacementPosX     DW 0
  1142. DisplacementPosY     DW 0
  1143.  
  1144. HyperCounter    DW 0
  1145. HyperPosX       DW 2345, 23456, 12035, 40657
  1146. HyperPosY       DW 7547, 52567, 23344, 35435
  1147.  
  1148. TwinAngle       DW 256
  1149. YSinA           DW 1000h
  1150. YCosA           DW 0
  1151.  
  1152. COMMENT #
  1153. TwinAngle       DW 45
  1154. YSinA           DW 2896
  1155. YCosA           DW 2896
  1156. #
  1157.  
  1158. RotXYAngle      DW 32768
  1159.  
  1160. COMMENT #
  1161. DisplacementsX       DW 64 DUP (0)
  1162. DisplacementsY       DW 64 DUP (0)
  1163. #
  1164.  
  1165. TunnelTable  LABEL WORD
  1166.         INCLUDE TUNNPATH.INC
  1167.         DW 64*2 DUP (0)
  1168.  
  1169.  
  1170.         UDATASEG
  1171.  
  1172. RotAngleTableSin DW 379 DUP(?)
  1173. RotAngleTableCos DW 379 DUP(?)
  1174.  
  1175. StarsPos        DW (NStars*3) DUP(?) ; X, Y, Z coords. of the stars.
  1176.  
  1177. DumpSize0       DW ?
  1178. DumpSize1       DW ?
  1179. DumpSize2       DW ?
  1180. DumpSize3       DW ?
  1181.  
  1182. StarsScr LABEL BYTE                  ; Offset.W, color.B in screen.
  1183. StarsScr10      DW NStars*3/2 + 1 DUP(?)   ; For each plane.
  1184. StarsScr11      DW NStars*3/2 + 1 DUP(?)
  1185. StarsScr12      DW NStars*3/2 + 1 DUP(?)
  1186. StarsScr13      DW NStars*3/2 + 1 DUP(?)
  1187.  
  1188. StarsScr20      DW NStars*3/2 + 1 DUP(?)   ; For each plane.
  1189. StarsScr21      DW NStars*3/2 + 1 DUP(?)
  1190. StarsScr22      DW NStars*3/2 + 1 DUP(?)
  1191. StarsScr23      DW NStars*3/2 + 1 DUP(?)
  1192.  
  1193. StarsScr30      DW NStars*3/2 + 1 DUP(?)   ; For each plane.
  1194. StarsScr31      DW NStars*3/2 + 1 DUP(?)
  1195. StarsScr32      DW NStars*3/2 + 1 DUP(?)
  1196. StarsScr33      DW NStars*3/2 + 1 DUP(?)
  1197.  
  1198.         END
  1199. ; ------------------------ End of STARF.ASM ---------------------------
  1200.  
  1201.